package com.jshan.blog.security;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import com.alibaba.nacos.shaded.com.google.gson.Gson;
import com.jshan.blog.properties.WhitelistProperties;
import com.jshan.blog.result.Result;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class SaTokenConfigure {


    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
                // 拦截的地址
                .addInclude("/**")
                .addExclude("/favicon.ico", "/api/admin/user/register", "/api/admin/user/doLogin")
                // 鉴权的方法，每次访问进入
                .setAuth(obj -> {
                    log.info("访问地址为：{}", SaHolder.getRequest().getRequestPath());
                    if ("OPTIONS".equalsIgnoreCase(SaHolder.getRequest().getMethod())) {
                        return; // 直接返回，不做任何处理
                    }
                    SaRouter.match("/**", "/api/admin/user/doLogin", r -> StpUtil.checkLogin());

                }).setError(obj -> {
                    // 在这里进行错误处理，返回 401 错误
                    if (obj instanceof SaTokenException) {
                        // 处理 token 失效的情况
                        log.error("Token 失效，返回 401");
                        Gson gson = new Gson();
                        Result fail = Result.fail(401, "登录已过期，请重新登录");
                        return gson.toJson(fail, Result.class);
                    }
                    return Result.noLogin();
                })
                ;
    }

}
